////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
#include "DataManager.hpp"

#include <SFML/Graphics/Texture.hpp>

#include <SmegTools/Debug/DebugNew.hpp>

namespace smeg {
    namespace core {

////////////////////////////////////////////////////////////
/// Constructor/Destructor
////////////////////////////////////////////////////////////
DataManager::DataManager()
{
}

////////////////////////////////////////////////////////////
/// Destructor
////////////////////////////////////////////////////////////
DataManager::~DataManager()
{
    DeInit();
}

////////////////////////////////////////////////////////////
/// DeInit the manager
////////////////////////////////////////////////////////////
void DataManager::DeInit() {
    ClearData();
}

////////////////////////////////////////////////////////////
/// Load a texture
////////////////////////////////////////////////////////////
const sf::Texture* DataManager::AddTexture( const std::string& _TextureName, const std::string& _Filename,
                                bool _bIsRepeated, bool _bIsSmooth, bool _bForce ) {        
    td_MapTexture::iterator itTex = m_Textures.find( _TextureName );
    sf::Texture* pNewTex;

    if ( itTex == m_Textures.end() || _bForce ) {
        pNewTex = new sf::Texture();
        if ( pNewTex->loadFromFile(_Filename) ) {
            pNewTex->setRepeated( _bIsRepeated );
            pNewTex->setSmooth( _bIsSmooth );

            if ( itTex == m_Textures.end() ) {
                m_Textures.insert( td_MapTexture::value_type( _TextureName, pNewTex ) );
            } else {
                delete itTex->second;
                itTex->second = pNewTex;
            }

            return pNewTex;
        }

        delete pNewTex;
    }

    return NULL;
}

////////////////////////////////////////////////////////////
/// Remove a texture
////////////////////////////////////////////////////////////
void DataManager::RemoveTexture( const std::string& _TextureName ) {
    td_MapTexture::iterator itTex = m_Textures.find( _TextureName );

    if ( itTex != m_Textures.end() ) {
        delete itTex->second;
        m_Textures.erase( itTex );
    }
}

////////////////////////////////////////////////////////////
/// Retrieve a loaded texture
////////////////////////////////////////////////////////////
const sf::Texture* DataManager::GetTexture( const std::string& _TextureName ) const {
    td_MapTexture::const_iterator itTex = m_Textures.find( _TextureName );

    if ( itTex != m_Textures.end() ) {
        return itTex->second;
    }

    return NULL;
}
    
////////////////////////////////////////////////////////////
/// Clear the loaded data
////////////////////////////////////////////////////////////
void DataManager::ClearData() {
    for ( td_MapTexture::iterator it = m_Textures.begin();
        it != m_Textures.end();
        ++it ) {
            delete it->second;
    }
    m_Textures.clear();
}

    } // namespace core
} // namespace smeg
